home *** CD-ROM | disk | FTP | other *** search
/ Christina Milan AM to PM / Christina Milan - AM to PM.iso / christin.dir / 00019_Script_Waft < prev    next >
Text File  |  2001-08-09  |  13KB  |  449 lines

  1. -- DESCRIPTION --
  2.  
  3. on getBehaviorDescription me
  4.   return "¼
  5. WAFT"&RETURN&RETURN&"¼
  6. Makes a sprite rise up the screen like a bubble, rotating first one way then ¼
  7. the other and vibrating horizontally as it rises.  The movement is somewhat ¼
  8. random."&RETURN&RETURN&"¼
  9. By placing the surface below the starting height of the sprite, ¼
  10. the same movement can be used to animate a falling leaf."&RETURN&RETURN&"¼
  11. The sprite will stop moving once it reaches the 'surface'.  At this moment it ¼
  12. will send a custom '#WaftBehavior_Done message to all sprites.  You can use¼
  13. this message to trigger actions on other sprites, or to modify the current ¼
  14. sprite.  See the example in the Notes for Developers."&RETURN&RETURN&"¼
  15. If you want random movement that continues indefinitely, use the ¼
  16. 'Random Movement and Rotation' behavior instead."&RETURN&RETURN&"¼
  17. PERMITTED MEMBER TYPES:"&RETURN&PermittedMemberTypes (me)&RETURN&RETURN&"¼
  18. * Number of degrees to rotate in each frame"&RETURN&"¼
  19. * Maximum number of frames to rotate in each direction"&RETURN&"¼
  20. * Maximum horizontally pixel shift in each frame"&RETURN&"¼
  21. * Maximum number of frames to move in each direction"&RETURN&"¼
  22. * Number of frames taken to reach the surface"&RETURN&"¼
  23. * Height of the surface"
  24. end getBehaviorDescription
  25.  
  26.  
  27. on getBehaviorTooltip me
  28.   return"¼
  29. Use with Bitmap, Flash and"&RETURN&"¼
  30. Vector Shape members."&RETURN&RETURN&"¼
  31. Imitate the movement of"&RETURN&"¼
  32. a rising bubble or a"&RETURN&"¼
  33. falling leaf."
  34. end getBehaviorTooltip
  35.  
  36.  
  37.  
  38. -- NOTES FOR DEVELOPERS --
  39.  
  40. -- The Move handler activated on each prepareFrame.  This calls three
  41. -- other handlers: ChangeLevel, Turn and Shift.  Each of these deals with
  42. -- an independent movement.
  43. --
  44. -- The three properties myRemainingFrames, myTurnCounter and myShiftCounter
  45. -- determine how many frames each movement varies over.  When myRemainingFrames
  46. -- reaches zero the behavior halts.  It sends a WaftBehavior_Done call to
  47. -- all sprites.
  48. --
  49. -- For example, you could place a behavior on the same sprite to swap the image
  50. -- of the rising bubble with a (non-looping) film loop of a bursting bubble and
  51. -- play a popping sound:
  52. --
  53. -- on WaftBehavior_Done me
  54. --   sprite (me.spriteNum).member = member "Bubble bursting"
  55. --   puppetSound 1, "Pop"
  56. -- end
  57.  
  58. -- PUBLIC METHODS
  59. -- This behavior supports the following external calls.  See the handlers
  60. -- themselves for details and copy-and-paste examples.
  61. --
  62. -- * Waft_Reset me, propertyList
  63. -- * Waft_GetReference me, theList
  64.  
  65.  
  66.  
  67. -- HISTORY --
  68.  
  69. -- 28 September 1998: written for the D7 Behaviors Palette by James Newton
  70. -- 23 November 1998:  randomness and public methods added, descriptions revised.
  71.  
  72.  
  73.  
  74. -- PROPERTIES --
  75.  
  76. property spriteNum
  77. property mySprite
  78. -- error checking
  79. property getPDLError
  80. -- author-defined parameters
  81. property myAnglePerFrame
  82. property myTurnFrames
  83. property myHShiftPerFrame
  84. property myShiftFrames
  85. property myTotalFrames
  86. property mySurfaceHeight
  87. -- internal properties
  88. property myInitialLoc
  89. property myRemainingFrames
  90. property myRotation
  91. property myTurnCounter
  92. property myDirection
  93. property myShiftCounter
  94. property myDoneFlag
  95.  
  96.  
  97.  
  98. -- EVENT HANDLERS --
  99.  
  100. on beginSprite me
  101.   Initialize me
  102. end beginSprite
  103.  
  104.  
  105. on prepareFrame me
  106.   if myRemainingFrames then
  107.     Move me
  108.   else if myDoneFlag then
  109.     SendCustomEvent me
  110.   end if
  111. end prepareFrame
  112.  
  113.  
  114.  
  115. -- CUSTOM HANDLERS --
  116.  
  117. on Initialize me -- sent by beginSprite
  118.   mySprite = sprite(me.spriteNum)
  119.   
  120.   -- Error checking
  121.   memberType = mySprite.member.type
  122.   if not PermittedMemberTypes(me).getPos(memberType) then
  123.     ErrorAlert (me, #invalidMemberType, memberType)
  124.   end if
  125.   -- End of error checking
  126.   
  127.   myInitialLoc = mySprite.loc
  128.   myRemainingFrames = myTotalFrames
  129.   myDoneFlag = TRUE
  130.   myTurnCounter  = myTurnFrames
  131.   myShiftCounter = myShiftFrames
  132. end Initialize
  133.  
  134.  
  135. on Move me -- sent by prepareFrame
  136.   ChangeLevel me
  137.   Turn me
  138.   Shift me
  139. end Move
  140.  
  141.  
  142. on ChangeLevel me -- sent by Move
  143.   currentV   = mySprite.locV
  144.   remainingV = currentV - mySurfaceHeight
  145.   deltaV = remainingV / myRemainingFrames
  146.   newV = currentV - deltaV 
  147.   mySprite.locV = newV
  148.   myRemainingFrames = myRemainingFrames - 1
  149. end ChangeLevel
  150.  
  151.  
  152. on Turn me -- sent by Move
  153.   if not myTurnCounter then
  154.     myRotation = not myRotation 
  155.     myTurnCounter = random (myTurnFrames)
  156.   end if
  157.   
  158.   myTurnCounter = myTurnCounter - 1
  159.   if myRotation then
  160.     newAngle = mySprite.rotation + myAnglePerFrame
  161.   else
  162.     newAngle = mySprite.rotation - myAnglePerFrame
  163.   end if
  164.   
  165.   mySprite.rotation = newAngle
  166. end Turn
  167.  
  168.  
  169. on Shift me -- sent by Move
  170.   if not myShiftCounter then
  171.     myDirection    = not myDirection 
  172.     myShiftCounter = random (myShiftFrames)
  173.   end if
  174.   
  175.   myShiftCounter = myShiftCounter - 1
  176.   if myDirection then
  177.     mySprite.locH = mySprite.locH + myHShiftPerFrame
  178.   else
  179.     mySprite.locH = mySprite.locH - myHShiftPerFrame
  180.   end if
  181. end Shift
  182.  
  183.  
  184. on SendCustomEvent me -- sent by prepareFrame
  185.   myDoneFlag = FALSE
  186.   sendAllSprites (#WaftBehavior_Done, spriteNum, me)
  187. end SendCustomEvent 
  188.  
  189.  
  190.  
  191. -- PUBLIC METHODS --
  192.  
  193. on Waft_Reset me, propertyList
  194.   -- Allows you to rest the behavior on the fly.  "propertyList" should be void 
  195.   -- or contain any or all of the following properties (acceptable value types
  196.   -- are shown in parentheses):
  197.   -- #anglePerFrame   (#integer | #float)
  198.   -- #turnFrames      (#integer | #float)
  199.   -- #hShiftPerFrame  (#integer | #float)
  200.   -- #shiftFrames     (#integer | #float)
  201.   -- #totalFrames     (#integer | #float)
  202.   -- #surfaceHeight   (#integer | #float)
  203.   -- #startLoc        (#point)
  204.   -- Apart from #startLoc, all these correspond to the properties set in the
  205.   -- Behavior Parameters dialog.  Any other properties or value types will be
  206.   -- ignored.  If "propertyList" is void, the behavior will restart with
  207.   -- its initial parameters.
  208.   --
  209.   -- Examples:
  210.   --
  211.   --   sendAllSprites (#Waft_Reset)
  212.   --
  213.   --   sendSprite (1, #Waft_Reset, [#turnFrames: 9, #totalFrames: random (60)])
  214.   --
  215.   --   waftRefList = sendAllSprites (#Waft_GetReference, [])
  216.   --   call (#Waft_Reset, waftRefList, [#totalFrames: 20 , #surfaceHeight: 12])
  217.   --
  218.   -- To play the behavior as a loop, add this behavior to the same sprite:
  219.   --   on WaftBehavior_Done me
  220.   --     call (#Waft_Reset, sprite(the currentSpriteNum).scriptInstanceList)
  221.   --   end
  222.   
  223.   unchangedProps = [#totalFrames, #startLoc]
  224.   
  225.   if not voidP (propertyList) then
  226.     if ilk  (propertyList) = #propList then
  227.       i = propertyList.count()
  228.       repeat while i
  229.         theProp = propertyList.getPropAt(i)
  230.         theValue = propertyList[i]
  231.         case theProp of
  232.           #anglePerFrame:
  233.             case ilk (theValue) of
  234.               #integer, #float:
  235.                 myAnglePerFrame = theValue
  236.                 propertyList.deleteAt(i)
  237.             end case
  238.           #turnFrames:
  239.             case ilk (theValue) of
  240.               #integer, #float:
  241.                 myTurnFrames = abs (integer (theValue))
  242.                 propertyList.deleteAt(i)
  243.             end case
  244.           #hShiftPerFrame:
  245.             case ilk (theValue) of
  246.               #integer, #float:
  247.                 myHShiftPerFrame = abs (integer (theValue))
  248.                 propertyList.deleteAt(i)
  249.             end case
  250.           #shiftFrames:
  251.             case ilk (theValue) of
  252.               #integer, #float:
  253.                 myShiftFrames = abs (integer (theValue))
  254.                 propertyList.deleteAt(i)
  255.             end case
  256.           #totalFrames:
  257.             case ilk (theValue) of
  258.               #integer, #float:
  259.                 myRemainingFrames = abs (integer (theValue))               
  260.                 propertyList.deleteAt(i)
  261.             end case
  262.           #surfaceHeight:
  263.             case ilk (theValue) of
  264.               #integer, #float:
  265.                 mySurfaceHeight = abs (integer (theValue))
  266.                 propertyList.deleteAt(i)
  267.             end case
  268.           #startLoc:
  269.             if ilk (theValue) = #point then
  270.               mySprite.loc = theValue
  271.               propertyList.deleteAt(i)
  272.             end if
  273.         end case
  274.         unchangedProps.deleteOne(theProp)
  275.         i = i - 1
  276.       end repeat
  277.       
  278.       if propertyList.count() then
  279.         -- Return list of invalid properties
  280.         return propertyList
  281.       end if
  282.       
  283.     else
  284.       return #invalidPropList
  285.     end if
  286.   end if
  287.   
  288.   -- Reuse unchanged values
  289.   if unChangedProps.getPos (#startLoc) then
  290.     mySprite.loc = myInitialLoc
  291.   end if
  292.   if unChangedProps.getPos (#totalFrames) then
  293.     myRemainingFrames = myTotalFrames
  294.   end if
  295.   myDoneFlag = TRUE
  296. end Waft_Reset
  297.  
  298.  
  299. on Waft_GetReference me, theList
  300.   -- Returns a reference to the current behavior.  theList is an optional
  301.   -- parameter.  Use an empty list in a sendAllSprites call to return a
  302.   -- list of all Waft behaviors in the current frame.  Use an empty linear list
  303.   -- to obtain a list of behaviors, or an empty property list to return a
  304.   -- list with sprite numbers as the properties and behavior references as
  305.   -- the values.  Examples :
  306.   --
  307.   --   put sendAllSprites (#Waft_GetReference, [])
  308.   --   -- [<offspring "Waft" 2 2f1b594>, <offspring "Waft" 2 2f0dac0>]
  309.   --
  310.   --   put sendAllSprites (#Waft_GetReference, [:])
  311.   --   -- [1: <offspring "Waft" 2 2f1b594>, 2: <offspring "Waft" 2 2f0dac0>]
  312.   --
  313.   -- if you leave "theList" void, then the handler will return a reference to
  314.   -- the behavior on the given sprite (using sendSprite) or the highest sprite
  315.   -- with the behavior (using sendAllSprites).  Examples:
  316.   -- 
  317.   --   put sendSprite (1, #Waft_GetReference)
  318.   --   -- <offspring "Waft" 2 2f1b594>
  319.   --
  320.   --   put sendAllSprites (#Waft_GetReference)
  321.   --   -- <offspring "Waft" 2 2f0dac0>
  322.   
  323.   case ilk (theList) of
  324.     #list: theList.append(me)
  325.     #propList: theList.addProp(me.spriteNum, me)
  326.     otherwise
  327.       return me
  328.   end case
  329.   return theList
  330. end Waft_GetReference
  331.  
  332.  
  333.  
  334. -- ERROR CHECKING --
  335.  
  336. on ErrorAlert me, theError, data
  337.   -- sent by getPropertyDescriptionList, Initialize
  338.   
  339.   case theError of
  340.     #getPDLError:
  341.       alert "¼
  342. Error: This behavior works only with the following members types:   "&¼
  343. permittedMemberTypes(me)&RETURN&RETURN&"¼
  344. Hit OK and then delete this behavior from the sprite."&RETURN&"¼
  345. For more information on deleting Behaviors, see the Help system."
  346.       if the optionDown then
  347.         return ¼
  348.  [ ¼
  349.  #getPDLError: ¼
  350.  [ ¼
  351.   #comment: "ERROR:  Wrong member type.  Click 'Cancel'.", ¼
  352.   #format:  #string, ¼
  353.   #range:   [""], ¼
  354.   #default:  "" ¼
  355.  ] ¼
  356. ]
  357.       end if
  358.       
  359.     otherwise
  360.       -- Determine the behavior's name
  361.       behaviorName = string (me)
  362.       delete word 1 of behaviorName
  363.       delete the last word of behaviorName
  364.       delete the last word of behaviorName
  365.       -- Convert #data to useful value
  366.       case data.ilk of
  367.         #void: data = "<void>"
  368.         #symbol: data = "#"&data
  369.       end case
  370.       
  371.       case theError of
  372.         #invalidMemberType:
  373.           alert "¼
  374. BEHAVIOR ERROR: Frame "&the frame&", Sprite "&me.spriteNum&RETURN&RETURN&"¼
  375. Behavior "&behaviorName&" only functions with the following member types:"&¼
  376. RETURN&permittedMemberTypes()&RETURN&RETURN&¼
  377. "Current type = "&data
  378.           halt
  379.           
  380.       end case
  381.   end case
  382. end ErrorAlert
  383.  
  384.  
  385.  
  386. -- AUTHOR-DEFINED PARAMETERS --
  387.  
  388. on getPropertyDescriptionList me
  389.   
  390.   if not the currentSpriteNum then exit
  391.   
  392.   -- Error check: does current sprite contain appropriate member type?
  393.   theMember = sprite(the currentSpriteNum).member
  394.   memberType = theMember.type
  395.   permittedTypes = PermittedMemberTypes(me)
  396.   if not permittedTypes.getPos(memberType) then
  397.     return errorAlert (me, #getPDLError, permittedTypes)
  398.   end if
  399.   
  400.   return ¼
  401. [ ¼
  402.  #myAnglePerFrame: ¼
  403.  [ ¼
  404.   #comment: "Angle to rotate in each frame:", ¼
  405.   #format:  #float, ¼
  406.   #default:  10 ¼
  407.  ], ¼
  408.  #myTurnFrames: ¼
  409.  [ ¼
  410.   #comment: "Maximum frames to rotate in each direction:", ¼
  411.   #format:  #Integer, ¼
  412.   #default:  10 ¼
  413.  ], ¼
  414.   #myHShiftPerFrame: ¼
  415.  [ ¼
  416.   #comment: "Maximum horizontal shift in each frame:", ¼
  417.   #format:  #integer, ¼
  418.   #default:  10 ¼
  419.  ], ¼
  420.  #myShiftFrames: ¼
  421.  [ ¼
  422.   #comment: "Maximum frames to shift in each direction:", ¼
  423.   #format:  #Integer, ¼
  424.   #default:  10 ¼
  425.  ], ¼
  426.  #myTotalFrames: ¼
  427.  [ ¼
  428.   #comment: "Number of frames to reach the surface:", ¼
  429.   #format:  #Integer, ¼
  430.   #default:  60 ¼
  431.  ], ¼
  432.  #mySurfaceHeight: ¼
  433.  [ ¼
  434.   #comment: "Height of surface (pixels from top of stage):", ¼
  435.   #format:  #integer, ¼
  436.   #default:  0¼
  437.  ] ¼
  438. ]
  439. end getPropertyDescriptionList
  440.  
  441.  
  442. on PermittedMemberTypes me
  443.   -- sent by:
  444.   -- getBehaviorDescription
  445.   -- getPropertyDescriptionList
  446.   -- Initialize
  447.   -- ErrorAlert
  448.   return [#bitmap, #flash, #vectorShape]
  449. end PermittedMemberTypes